package com.hehui.module.goods.contorller;

import com.hehui.common.core.commom.AjaxResult;
import com.hehui.common.core.controller.BaseController;
import com.hehui.common.utils.StringUtils;
import com.hehui.module.goods.entity.GoodsCategory;
import com.hehui.module.goods.service.IGoodsCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 商品分类控制类  已完成----未与前端进行测试
 */
@RestController
@RequestMapping("/GoodsCategory")
public class GoodsCategoryContorller extends BaseController {

    @Autowired
    IGoodsCategoryService goodsCategoryService;

    /**
     * 查询所有顶级分类 带商户Id （已修改）
     * @return 所有顶级分类
     */
    @GetMapping("/findGoodsCategoryTopAll")
    public AjaxResult findGoodsCategoryTopAll(Long merchantId){
        // 查询 所有顶级分类 默认 查询is_del 为1的 和 顶级分类为 0
        List<GoodsCategory> list = goodsCategoryService.findGoodsCategoryTopAll(merchantId);
        return AjaxResult.success(list);
    }

    /**
     * 根据上级分类id查询所属下级分类
     * @param parentId 上级分类id
     * @return 所属分类集合
     */
    @GetMapping("/findGoodsCategoryByParentId")
    public AjaxResult findGoodsCategoryByParentId( Long parentId){
        // 输入的上级的分类id不能为空值 或者 顶级父id
        if(parentId == null || parentId <= 0 ){
            return AjaxResult.success("输入上级分类id不正确，不能是0或负数和null值");
        }
        List<GoodsCategory> list = goodsCategoryService.findGoodsCategoryByParentId(parentId);
        return AjaxResult.success(list);
    }

    /**
     * 展开和收起 -（等于是查询所有分类 默认查询 is_del 为1） 带商户id
     * @param merchantId 商户id
     * @return 返回所有分类集合数据
     */
    @GetMapping("/findGoodsCategory")
    public AjaxResult findGoodsCategoryAll(Long merchantId){
        List<GoodsCategory> list = goodsCategoryService.findGoodsCategory(merchantId);
        return AjaxResult.success(list);
    }

    /**
     * 添加分类  - 获取最大编号 带商户id （已修改）
     * @return 最大编号 默认数据库中最大编号 + 1
     */
    @GetMapping("/findMaxNum")
    public AjaxResult findMaxNum(Long merchantId){
        AjaxResult ajax = AjaxResult.success();
        // 查询最大编号
        String num = goodsCategoryService.goodsCategoryFindMaxNum(merchantId);
        // 最大编号加 1
        num = (Integer.parseInt(num)+1)+"";
        ajax.put("num",num);
        return ajax;
    }

    /**
     * 添加分类
     * @param goodsCategory
     * @return
     */
    @PostMapping("/addGoodsCategory")
    public AjaxResult addGoodsCategory(@RequestBody GoodsCategory goodsCategory){
        // 判断编号是否为空
        if(StringUtils.isEmpty(goodsCategory.getGcNum())){
            return AjaxResult.success("添加失败，分类编号不能为空");
        }
        // 判断分类名是否为空
        if (StringUtils.isEmpty(goodsCategory.getGcName())){
            return AjaxResult.success("添加失败，分类名不能为空");
        }
        // 判断是否设为默认的值不能为空 只能是 1 或者 0
        if(StringUtils.isEmpty(goodsCategory.getIsDef())
                && (!goodsCategory.getIsDef().equals("1") || !goodsCategory.getIsDef().equals("0"))){
            return AjaxResult.success("添加失败，是否默认的值 只能是“1” 或者 “0” ");
        }
        // 判断编号是否有重复 带商户id
        List<GoodsCategory> list = goodsCategoryService.findCateGoryGcNum(goodsCategory.getGcNum(),goodsCategory.getGcMerchantid());
        if (StringUtils.isNotEmpty(list)){
            return AjaxResult.success("添加失败，分类编号重复");
        }
        // 判断分类名字是否重复 带商户id
        List<GoodsCategory> list1 = goodsCategoryService.findCateGoryGcName(goodsCategory.getGcName(),goodsCategory.getGcMerchantid());
        if(StringUtils.isNotEmpty(list1)){
            return AjaxResult.success("添加失败，分类名重复");
        }
        // 如果上级分类未填写 默认为 一级分类 0
        if(goodsCategory.getGcParentid() == null || goodsCategory.getGcParentid() < 0){
            goodsCategory.setGcParentid(0L);
        }
        // 如果新添加分类默认值= 1 ，修改已经设为默认的分类
        if (goodsCategory.getIsDef().equals("1")){
            //获取 其他默认分类
            List<GoodsCategory> list3 = goodsCategoryService.findCateGoryByIsDef(goodsCategory.getIsDef(),goodsCategory.getGcMerchantid());
            if (StringUtils.isNotEmpty(list3)){
                for (GoodsCategory category : list3) {
                    // 循环修改默认值
                    goodsCategoryService.upGoodsCateGoryIsDef(category);
                }
            }

        }
        // 添加分类
        return toAjax(goodsCategoryService.addGoodsCategory(goodsCategory));
    }

    /**
     * 根据id查询分类数据
     * @param categoryId
     * @return
     */
    @GetMapping("/findGoodsCategoryById")
    public AjaxResult findGoodsCategoryById(Long categoryId){
        GoodsCategory goodsCategory = goodsCategoryService.findGoodsCategoryById(categoryId);
        return AjaxResult.success(goodsCategory);
    }

    /**
     * 修改分类
     * @param goodsCategory
     * @return
     */
    @PostMapping("/upGoodsCategory")
    public AjaxResult upGoodsCategory(@RequestBody GoodsCategory goodsCategory){
        // 判断分类名称 和编号 是否为空
        if (StringUtils.isEmpty(goodsCategory.getGcName()) || StringUtils.isEmpty(goodsCategory.getGcNum())){
            return AjaxResult.success("修改失败，分类名或编号不能为空");
        }
        // 判断默认值是否为空，是否是 “1” 或者 “0”
        if (StringUtils.isEmpty(goodsCategory.getIsDef())
                && (goodsCategory.getIsDef().equals("1") ||goodsCategory.getIsDef().equals("0"))){
            return AjaxResult.success("修改失败，默认只能是 “1” 或者 “0” ");
        }

        // 判断上级分类 == null 或者小于 0 ，默认为 设为 一级分类
        if(goodsCategory.getGcParentid() == null || goodsCategory.getGcParentid() < 0){
           // 设为一级分类
            goodsCategory.setGcParentid(0L);
        }

        // 判断分类编号在数据库是否存在
        List<GoodsCategory> cateGoryGcNum = goodsCategoryService.findCateGoryGcNum(goodsCategory.getGcNum(),goodsCategory.getGcMerchantid());
        if (StringUtils.isNotEmpty(cateGoryGcNum)){
            // 循环判断 重复的编号是不是自己
            for (GoodsCategory category : cateGoryGcNum) {
                if (category.getGcCategory() != goodsCategory.getGcCategory()){
                    return AjaxResult.success("修改失败，分类编号重复");
                }
            }

        }
        // 判断分类名字在数据库是否存在
        List<GoodsCategory> cateGoryGcName = goodsCategoryService.findCateGoryGcName(goodsCategory.getGcName(),goodsCategory.getGcMerchantid());
        if (StringUtils.isNotEmpty(cateGoryGcName)){
            // 循环判断 重复的名字是不是自己
            for (GoodsCategory category : cateGoryGcName) {
                if (category.getGcCategory() != goodsCategory.getGcCategory()){
                    return AjaxResult.success("修改失败，分类名字重复");
                }
            }

        }

        // 如果默认值为 1，修改其他分类的默认值
        if (goodsCategory.getIsDef().equals("1")){
            //获取 其他默认分类
            List<GoodsCategory> list3 = goodsCategoryService.findCateGoryByIsDef(goodsCategory.getIsDef(),goodsCategory.getGcMerchantid());
            if (StringUtils.isNotEmpty(list3)){
                for (GoodsCategory category : list3) {
                    // 循环修改默认值
                    goodsCategoryService.upGoodsCateGoryIsDef(category);
                }
            }
        }

        /*
           修改分类等级
           根据父id来修改 分类等级,如果父id为 0 ，则直接设置 分类等级为1
        */
        if(goodsCategory.getGcParentid() == 0){
            goodsCategory.setGcLevel("1");
        }else {
            // 根据 父id查询分类等级
          String level =  goodsCategoryService.findCateGoryGcLevelByParentId(goodsCategory.getGcParentid());
          // 因为这个查询的上级分类的状态，所以需要加1
            level = (Integer.parseInt(level)+1)+"";

          goodsCategory.setGcLevel(level);
        }

        // 修改分类
        return toAjax(goodsCategoryService.upGoodsCateGory(goodsCategory));
    }

    // 删除分类  判断 下面是否有子分类 ，如果有不允许删除，
    // 如果没有，删除后分类，分类对应的商品放入 默认分类中

    /**
     * 根据分类主键 删除分类
     * @param categoryId 分类主键
     * @Param merchantId 商户id
     * @return
     */
    @GetMapping("/delGoodsCategory")
    public AjaxResult delGoodsCategory(Long categoryId,Long merchantId){

        // 通过主键查询到所对应的分类
        List<GoodsCategory> list = goodsCategoryService.findGoodsCategoryByParentId(categoryId);

        // 如果集合为空直接删除
        if (StringUtils.isEmpty(list) || list.size() == 0){
            // 查询商品表 获得商品对应商品的信息
            List<BaseGoods> goodsList = goodsCategoryService.findBaseGoodsBycategoryId(categoryId);


            // 如果查询的商品不为null, 循环修改 商品的分类id
            if (StringUtils.isNotEmpty(goodsList) && goodsList.size() > 0){
                // 获取默认分类的id (用于修改商品表的商品分类编号) 带商户id
                Long is_DefId = goodsCategoryService.findCateGoryByIsDef("1",merchantId).get(0).getGcCategory();

                for (BaseGoods baseGoods : goodsList) {
                    baseGoods.setBgGoodcategoryid(is_DefId);
                   goodsCategoryService.upBaseGoodsCategoryId(baseGoods);
                }

            }

            // 删除分类
            return toAjax(goodsCategoryService.delGoodsCategoryById(categoryId));
        }

        // 如果存在下级分类不能删除
        return AjaxResult.success("此分类存在下级分类，不能删除");



    }

}


